package br.urca.controller;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Result;
import br.urca.dao.AlunosCursoDAO;
import br.urca.dao.DisciplinaDAO;
import br.urca.dao.DisciplinasCursadasDAO;
import br.urca.dao.DisciplinasMatriculadasDAO;
import br.urca.dao.FrequenciaDAO;
import br.urca.dao.FrequenciaHistDAO;
import br.urca.dao.OfertaDAO;
import br.urca.dao.TotalAulasDAO;
import br.urca.dao.TotalAulasHistDAO;
import br.urca.interceptor.InterceptResource;
import br.urca.model.AlunoCurso;
import br.urca.model.Disciplina;
import br.urca.model.DisciplinaCursada;
import br.urca.model.DisciplinaMatriculada;
import br.urca.model.Frequencia;
import br.urca.model.FrequenciaHist;
import br.urca.model.FrequenciaPK;
import br.urca.model.Oferta;
import br.urca.model.TotalAulas;
import br.urca.model.TotalAulasHist;
import br.urca.model.TotalAulasPK;
import br.urca.model.json.AlunoFrequencia;

@Controller
@InterceptResource
public class LancamentoFrequenciaController {
	
	public static final int LENGTH_OFERTA = 5;
	public static final int LENGTH_PEDIDO = 5;

	private AlunosCursoDAO mAlunoCursoDAO;
	private DisciplinaDAO mDisciplinaDAO;
	private OfertaDAO mOfertaDAO;
	private FrequenciaDAO mFrequenciaDAO;
	private FrequenciaHistDAO mFrequenciaHistDAO;
	private DisciplinasMatriculadasDAO mMatriculasDAO;
	private DisciplinasCursadasDAO mMatriculasHistDAO;
	private TotalAulasDAO mTotalAulasDAO;
	private TotalAulasHistDAO mTotalAulasHistDAO;
	
	private HttpServletRequest request;
	private Result result;
	
	public LancamentoFrequenciaController() {
	}

	@Inject
	public LancamentoFrequenciaController(AlunosCursoDAO mAlunoCursoDAO,
			DisciplinaDAO mDisciplinaDAO, OfertaDAO mOfertaDAO,
			FrequenciaDAO mFrequenciaDAO, FrequenciaHistDAO mFrequenciaHistDAO,
			DisciplinasMatriculadasDAO mMatriculasDAO,
			DisciplinasCursadasDAO mMatriculasHistDAO,
			TotalAulasDAO mTotalAulasDAO, TotalAulasHistDAO mTotalAulasHistDAO,
			HttpServletRequest request, Result result) {
		super();
		this.mAlunoCursoDAO = mAlunoCursoDAO;
		this.mDisciplinaDAO = mDisciplinaDAO;
		this.mOfertaDAO = mOfertaDAO;
		this.mFrequenciaDAO = mFrequenciaDAO;
		this.mFrequenciaHistDAO = mFrequenciaHistDAO;
		this.mMatriculasDAO = mMatriculasDAO;
		this.mMatriculasHistDAO = mMatriculasHistDAO;
		this.mTotalAulasDAO = mTotalAulasDAO;
		this.mTotalAulasHistDAO = mTotalAulasHistDAO;
		this.request = request;
		this.result = result;
	}

	@Get("/lancamentofrequencia")	
	public void index() {
		
	}
	
	@Get("/lancamentofrequencia/alunos")
	public void lista() { 
		
	}
	
	@Get("/lancamentofrequencia/historico")
	public void historico() {
		
	}
	
	public void salvarFrequencias(List<AlunoFrequencia> listFrequencia, 
			short totalAulas, boolean atualizarHist) {
		try {
			
			if ((listFrequencia != null) && (!listFrequencia.isEmpty())) {
				
				TotalAulas mTotalAulas;
				TotalAulasHist mTotalAulasHist;
				
				if (!atualizarHist) {
					
					TotalAulasPK pk = new TotalAulasPK(
							listFrequencia.get(0).getFrequencia().getId().getCodOferta(),
							listFrequencia.get(0).getFrequencia().getId().getCodPedido(),
							listFrequencia.get(0).getFrequencia().getId().getAno(),
							listFrequencia.get(0).getFrequencia().getId().getMes());
					
					mTotalAulas = new TotalAulas(pk, totalAulas);
					mTotalAulasDAO.salvar(mTotalAulas);
					for (AlunoFrequencia af: listFrequencia) {
						mFrequenciaDAO.salvar(af.getFrequencia());
					}
				} else {
					
					TotalAulasPK pk = new TotalAulasPK(
							listFrequencia.get(0).getFrequenciaHist().getId().getCodOferta(),
							listFrequencia.get(0).getFrequenciaHist().getId().getCodPedido(),
							listFrequencia.get(0).getFrequenciaHist().getId().getAno(),
							listFrequencia.get(0).getFrequenciaHist().getId().getMes());
					
					mTotalAulasHist = new TotalAulasHist(pk, totalAulas);
					mTotalAulasHistDAO.salvar(mTotalAulasHist);
					for (AlunoFrequencia af: listFrequencia) {
						mFrequenciaHistDAO.salvar(af.getFrequenciaHist());
					}
				}	
				
				result.include("mensagem","Dados gravados com sucesso!")
					.redirectTo(this).index();
			}
			
		} catch (Exception e) {
			result.include("mensagem","Falha ao tentar gravar! "+e.getMessage())
				.redirectTo(this).index();
		}
		
	}

	public void buscar(String oferta, String pedido, short ano, short mes) {
		if ((oferta != null)  && (pedido != null)) {
			
			List<AlunoFrequencia> listFrequencia = new ArrayList<AlunoFrequencia>();
			
			//Valida dados informados pelo usuário
			try {
				Integer.parseInt(oferta);
				Integer.parseInt(pedido);
				if ((oferta.length() < LENGTH_OFERTA)
						|| (pedido.length() < LENGTH_PEDIDO)) {
					throw new Exception();
				}
			} catch(Exception e) {
				result.include("mensagem", "Oferta e/ou pedido inválido. "
						+ "Por favor verifique e tente novamente!");
				result.redirectTo(this).index();
				return;
			}
			
			Oferta mOferta = mOfertaDAO.buscarPorOfertaPedido(oferta, pedido);
			
			if (mOferta != null) {
				
				//Pega a disciplina da oferta para enviar para a view
				Disciplina disciplina = mDisciplinaDAO.buscarPorId(mOferta.getCodDisciplina());														
				
				//Pega todos os alunos matriculados na oferta
				List<DisciplinaMatriculada> listMatriculas = mMatriculasDAO
						.buscarPorOferta(mOferta);
				
				if ((listMatriculas != null) && (!listMatriculas.isEmpty())) {
					for (DisciplinaMatriculada matriculas: listMatriculas) {
						//Pega os dados cadastrais do aluno
						AlunoCurso aluno = mAlunoCursoDAO
								.buscaPorMatricula(matriculas.getId().getMatricula());
						
						//Pega o registro da frequencia caso ele exista
						Frequencia regFreq = mFrequenciaDAO.getObjetct(oferta, pedido, ano, mes, aluno.getMatricula());
						if (regFreq == null)
							regFreq = new Frequencia(new FrequenciaPK(oferta, pedido, ano, mes, aluno.getMatricula()),(short) 0);
						AlunoFrequencia alunoFrequencia = 
								new AlunoFrequencia(regFreq, aluno);
						listFrequencia.add(alunoFrequencia);
					}
					
					TotalAulas mAulas = mTotalAulasDAO.getObject(oferta, pedido, ano, mes);	
					
					Collections.sort(listFrequencia, AlunoFrequencia.POR_NOME);
					result.include("listFrequencia", listFrequencia)
						.include("disciplina", disciplina.getNomeDisciplina())
						.include("oferta", oferta)
						.include("pedido", pedido)
						.include("totalAulas", (mAulas == null ? 0 : mAulas.getTotalAulas()))
						.include("atualizarHist", false)
						.redirectTo(this).lista();
				} else {
					
					//Pega todos os alunos matriculados na oferta
					List<DisciplinaCursada> listMatriculasHist = mMatriculasHistDAO
							.buscarPorOferta(mOferta);
					
					if ((listMatriculasHist != null) && (!listMatriculasHist.isEmpty())) {
						for (DisciplinaCursada matriculasHist: listMatriculasHist) {
							//Pega os dados cadastrais do aluno
							AlunoCurso aluno = mAlunoCursoDAO
									.buscaPorMatricula(matriculasHist.getId().getMatricula());
							
							//Pega o registro da frequencia caso ele exista
							FrequenciaHist regFreq = mFrequenciaHistDAO.getObject(oferta, pedido, ano, mes, aluno.getMatricula());
							if (regFreq == null)
								regFreq = new FrequenciaHist(new FrequenciaPK(oferta, pedido, ano, mes, aluno.getMatricula()),(short) 0);
							AlunoFrequencia alunoFrequencia = 
									new AlunoFrequencia(regFreq, aluno);
							listFrequencia.add(alunoFrequencia);
						}
						
						TotalAulasHist mAulas = mTotalAulasHistDAO.getObject(oferta, pedido, ano, mes);	
						
						Collections.sort(listFrequencia, AlunoFrequencia.POR_NOME);
						result.include("listFrequencia", listFrequencia)
							.include("disciplina", disciplina.getNomeDisciplina())
							.include("oferta", oferta)
							.include("pedido", pedido)
							.include("totalAulas", (mAulas == null ? 0 : mAulas.getTotalAulas()))
							.include("atualizarHist", true)
							.redirectTo(this).historico();
					}
				}
			}	
		}
	}
	
}
